% =========================================================================
% run_simulation_new.m - (V3-精确模型版) NMPC能量管理仿真主程序
%
% 核心功能:
% 1. 调用 InitParameters_new.m 初始化所有基于精确模型的参数。
% 2. 在仿真循环中，正确调用 nlmpcmove 计算最优控制量。
% 3. 将运行时参数 P_load_k 正确地放置在 nloptions.Parameters 中。
% 4. 调用包含精确电化学模型的 prediction_model_new.m 来更新系统状态。
% 5. 可视化最终的仿真结果。
% =========================================================================

%% 1. 初始化
clear; clc; close all;
InitParameters_new; % 运行初始化脚本

%% 2. 设置初始条件和扰动序列
x0 = [0.8; FCParams.P_fc_min; 0]; % 初始状态: [SOC=80%, P_fc=min, alpha=0]
u0 = 0;                           % 初始控制输入: 燃料电池指令电流 I_fc_cmd = 0 A

% 创建一个模拟的负载功率序列 (P_load)
N_sim = floor(SimParams.T_sim / SimParams.Ts); % 总仿真步数
P_load_sequence = 200 * ones(N_sim, 1);
P_load_sequence(50:150) = 800; 
P_load_sequence(151:175) = linspace(800,400,25);
P_load_sequence(176:300) = 400;
P_load_sequence(301:400) = 1200;
P_load_sequence(401:N_sim) = 600;

%% 3. 仿真准备
x_history = zeros(N_sim+1, nx);
u_history = zeros(N_sim, nu);
x_history(1,:) = x0';

xk = x0;
uk = u0;

nloptions = nlmpcmoveopt();

disp('仿真开始 (使用基于电化学原理的精确模型)...');
tic; % 开始计时

%% 4. NMPC 闭环仿真主循环
for k = 1:N_sim
    P_load_k = P_load_sequence(k);
    
    nloptions.Parameters = {P_load_k};
    
    [uk, nloptions, info] = nlmpcmove(nlobj, xk, uk, [], [], nloptions);
    
    xk_next = prediction_model_new(xk, uk, P_load_k);
    
    u_history(k,:) = uk';
    x_history(k+1,:) = xk_next';
    xk = xk_next;
end

sim_duration = toc; % 结束计时
disp('仿真结束。');
disp(['总耗时: ', num2str(sim_duration), ' 秒。']);

%% 5. 结果可视化
t = 0:SimParams.Ts:SimParams.T_sim;
figure('Name', '状态量变化曲线 (精确模型版)');
subplot(3,1,1);
plot(t, x_history(:,1), 'b', 'LineWidth', 2);
title('SOC 变化曲线'); grid on; ylabel('SOC'); ylim([0.15, 0.85]);

subplot(3,1,2);
plot(t, x_history(:,2), 'r', 'LineWidth', 2);
title('燃料电池实际输出功率 P_{fc} 变化曲线'); grid on; ylabel('P_{fc} (W)');

subplot(3,1,3);
plot(t, x_history(:,3), 'g', 'LineWidth', 2);
title('燃料电池老化状态 \alpha_{decay} 变化曲线'); grid on; ylabel('\alpha_{decay}');

figure('Name', '控制量与功率分配 (精确模型版)');
subplot(2,1,1);
plot(t(1:end-1), u_history(:,1), 'm', 'LineWidth', 2);
title('NMPC输出控制量: 燃料电池指令电流 I_{fc,cmd}');
grid on; ylabel('I_{fc,cmd} (A)');

P_fc_actual = x_history(2:end, 2);
P_bat_actual = P_load_sequence - P_fc_actual;
subplot(2,1,2);
plot(t(1:end-1), P_load_sequence, 'k--', 'LineWidth', 1.5); hold on;
plot(t(1:end-1), P_fc_actual, 'r-', 'LineWidth', 2);
plot(t(1:end-1), P_bat_actual, 'b-', 'LineWidth', 2);
title('功率分配曲线');
legend('总负载 P_{load}', '燃料电池功率 P_{fc}', '锂电池功率 P_{bat}');
grid on; ylabel('功率 (W)');
